package thread;

import java.util.jar.JarOutputStream;

public class SyncDemo2 {
    public static void main(String[] args) {
        Shop shop = new Shop();
        Shop shop2 = new Shop();
        Shop shop3 = new Shop();
        Thread t1 = new Thread("王克晶"){
            public void run(){
               // shop.buy();
                shop2.buy();
            }
        };
        Thread t2 = new Thread("范冰冰"){
            public void run(){
              //  shop.buy();
                shop3.buy();
            }
        };
        t1.start();
        t2.start();

    }
}

/*
//对方法进行上锁
class Shop{
    public  synchronized  void buy(){
        try {
            Thread t = Thread.currentThread();
            System.out.println(t.getName()+":正在挑衣服");
            Thread.sleep(1000);
            System.out.println(t.getName()+":正在试衣服");
            Thread.sleep(1000);
            System.out.println(t.getName()+"结账离开");
        } catch (InterruptedException e) {
           e.printStackTrace();
        }
    }
}*/
//对具体的试衣服上锁
class Shop{
    public  void buy(){
        try {
            //Thread.currentThread() 返回的是实际调用当前方法的线程。例如：
            //
            //如果方法 methodA() 中包含这行代码，那么当线程 Thread-1 调用 methodA() 时，获取的就是 Thread-1。
            //
            //如果另一个线程 Thread-2 调用同一个 methodA()，获取的就是 Thread-2。
            Thread t = Thread.currentThread();//获取运行该方法的线程
            System.out.println(t.getName()+":正在挑衣服");
            Thread.sleep(5000);
            //this是你所属的这个方法的对象，即this就是buy方法的所属对象，你调哪个对象的buy方法，this就是哪个对象，
            // this 是Java中的关键字，指向当前正在执行方法的对象实例。
            //在 Shop 类的 buy() 方法中，this 指向调用该方法的 Shop 对象。
            // 你创建了一个对象 shop1，它有一个方法 buy() → 这个 buy() 方法是属于 shop1 的
            //你也创建了 shop2，它也有一个 buy() 方法 → 这个 buy() 是属于 shop2 的
            // t 是运行当前方法的线程对象（比如 王克晶 线程、范传奇 线程）。
            //每个线程都有自己的 Thread 对象，它们是不同的对象。所以t不能放在括号里。
            synchronized ( this)
            //synchronized ("hello")
            {
                System.out.println(t.getName()+":正在试衣服");
                Thread.sleep(5000);
            }

            System.out.println(t.getName()+"结账离开");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
